#
#
# def heap_sort(lst):
#     def adjust_heap(lst,i,size):
#         left_index = 2*i +1
#         right_index = 2*i +2
#         largest_index = i
#         if left_index < size and lst[left_index] > lst[largest_index]:
#             largest_index = left_index
#         if right_index < size and lst[right_index] > lst[largest_index]:
#             largest_index = right_index
#         if largest_index != i:
#             lst[largest_index],lst[i] = lst[i],lst[largest_index]
#             adjust_heap(lst,largest_index,size)
#     def built_heap(lst,size):
#         for i in range(len(lst)//2)[::-1]:
#             adjust_heap(lst,i,size)
#
#     size = len(lst)
#     built_heap(lst,size)
#     for i in range(len(lst))[::-1]:
#         lst[0],lst[i] = lst[i],lst[0]
#         adjust_heap(lst,0,i)
#     return lst
# nums = [5,4,3,2,1]
# # print(heap_sort([5,4,3,2,1]))
# for i in range(len(nums))[::-1]:
#     print(i)
#
def heap_sort(lst):
    def adjust_heap(lst,i,size):
        left_index = 2*i + 1
        right_index = 2*i + 2
        max_index = i
        if left_index < size and lst[left_index] > lst[max_index]:
            max_index = left_index
        if right_index < size and lst[right_index] > lst[max_index]:
            max_index = right_index
        if max_index != i:
            lst[i],lst[max_index] = lst[max_index],lst[i]
            adjust_heap(lst,max_index,size)
        print(lst)
    def build_heap(lst,size):
        for i in range(len(lst)//2)[::-1]:
            adjust_heap(lst,i,size)

    n = len(lst)
    build_heap(lst,n)
    print(lst,"===")
    for i in range(n)[::-1]:
        lst[0],lst[i] = lst[i],lst[0]
        adjust_heap(lst,0,i)
        print(f"i={i}",lst)
    return lst

'''
堆排序（Heapsort）是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构，并同时满足堆积的性质：
即子结点的键值或索引总是小于（或者大于）它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法：
大顶堆：每个节点的值都大于或等于其子节点的值，在堆排序算法中用于升序排列；
小顶堆：每个节点的值都小于或等于其子节点的值，在堆排序算法中用于降序排列；
堆排序的平均时间复杂度为 Ο(nlogn)。
（1）算法步骤
创建一个堆 H[0……n-1]；
把堆首（最大值）和堆尾互换；
把堆的尺寸缩小 1，并调用 shift_down(0)，目的是把新的数组顶端数据调整到相应位置；
重复步骤 2，直到堆的尺寸为 1。
'''

'''
时间复杂度：O(N*logN) --最好、最坏、平均
空间复杂度：O(1)
'''
print(heap_sort([5,4,3,2,1]))











